package com.michael.leetcode;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class Robot_2069 {
    class Robot {
        // 地图
        private int[][] map;
        // 当前位置的x坐标
        private int[] currentPos;
        // 方向 "North"，"East"，"South" 和 "West"
        private String forward;

        public Robot(int width, int height) {
            map = new int[width][height];
            currentPos = new int[2];
            forward = "East";
        }

        public void step(int num){
            int m = (map.length + map[0].length-2)* 2;
            if (num >= m && num % m == 0 && currentPos[0] == 0 && currentPos[1] == 0) {
                forward = "South";
            };

            int cc = num % m;
            step1(cc);
        }
        // 超时了
        private void step1(int num) {
            int mx = map.length - 1;
            int my = map[0].length-1;

            if (this.forward.equals("East")){
                int tmp = currentPos[0] + num;
                if (tmp > mx){
                    currentPos[0] = mx;
                    turn();
                    int tmp2 = tmp - mx;
                    step1(tmp2);
                    return;

                }else {
                    currentPos[0] = tmp;
                }
            }
            if (this.forward.equals("North")){
                int tmp = currentPos[1] + num;
                if (tmp > my){
                    currentPos[1] = my;
                    turn();
                    int tmp2 = tmp - my;
                    step1(tmp2);
                    return;

                }else {
                    currentPos[1] = tmp;
                }
            }
            if (this.forward.equals("West")){
                int tmp = currentPos[0] - num;
                if (tmp < 0){
                    currentPos[0] = 0;
                    turn();
                    int tmp2 = Math.abs(tmp);
                    step1(tmp2);
                    return;
                }else {
                    currentPos[0] = tmp;
                }
            }

            if (this.forward.equals("South")){
                int tmp = currentPos[1] - num;
                if (tmp < 0){
                    currentPos[1] = 0;
                    turn();
                    int tmp2 = Math.abs(tmp);
                    step1(tmp2);
                    return;
                }else {
                    currentPos[1] = tmp;
                }
            }

        }


        public int[] getPos() {
            return currentPos;
        }

        public String getDir() {
            return forward;
        }

        private void turn() {
            switch (this.forward) {
                case "East" -> this.forward = "North";
                case "North" -> this.forward = "West";
                case "West" -> this.forward = "South";
                default -> this.forward = "East";
            }
        }

    }

    @Test
    public void test(){
        Robot robot = new Robot(6, 3); // 初始化网格图，机器人在 (0, 0) ，朝东。
        robot.step(2);  // 机器人朝东移动 2 步，到达 (2, 0) ，并朝东。
        robot.step(2);  // 机器人朝东移动 2 步，到达 (4, 0) ，并朝东。
        robot.getPos(); // 返回 [4, 0]
        robot.getDir(); // 返回 "East"
        robot.step(2);  // 朝东移动 1 步到达 (5, 0) ，并朝东。
        // 下一步继续往东移动将出界，所以逆时针转变方向朝北。
        // 然后，往北移动 1 步到达 (5, 1) ，并朝北。
        robot.step(1);  // 朝北移动 1 步到达 (5, 2) ，并朝 北 （不是朝西）。
        robot.step(4);  // 下一步继续往北移动将出界，所以逆时针转变方向朝西。
        // 然后，移动 4 步到 (1, 2) ，并朝西。
        robot.getPos(); // 返回 [1, 2]
        robot.getDir(); // 返回 "West"
        log.info("test ");
    }

    @Test
    public void test1(){
        Robot robot = new Robot(6, 3); // 初始化网格图，机器人在 (0, 0) ，朝东。
        robot.step(15);  // 机器人朝东移动 2 步，到达 (2, 0) ，并朝东。
        log.info("test ");
    }
}
